3.4. ÐÁÃËÁÇÅ ÕÓÁÇÅ ÔHE FOLLOWING PSEUDO-CODE OUTLINES HOW A USER PROGRAM IS EXPECTED TO USE THE BURST READING PACKAGE: . JSR PUT_FILENAME_INTO_BURSTÂUF . LDX #FILENAME_LENGTH . LDA #DEVICE_NUMBER . JSR BURSTÏPEN . BCS REPORTÅRROR . Ì1: JSR PROCESS_BURSTÂUF_DATA . LDA BURSTÓTATUS . CMP #$1F . BEQ Ì2 . JSR BURSTÒEAD . BCC Ì1 . JSR REPORTÅRROR . Ì2: JSR BURSTÃLOSE 4. ÉÍÐÌÅÍÅÎÔÁÔÉÏÎ ÔHIS SECTION DISCUSSES THE CODE THAT IMPLEMENTS THE WORD COUNTING PROGRAM. ÉT IS HERE IN A SPECIAL FORM; EACH CODE LINE IS PRECEEDED BY A FEW SPECIAL CHARACTERS AND THE LINE NUMBER. ÔHE SPECIAL CHARACTERS ARE THERE TO ALLOW YOU TO EASILY EXTRACT THE ASSEMBLER CODE FROM THE REST OF THIS MAGAZINE (AND ALL OF MY UGLY COMMENTS). ÏN A ÕNIX SYSTEM, ALL YOU HAVE TO DO IS EXECUTE THE FOLLOWING COMMAND LINE (SUBSTITUTE FILENAMES AS APPROPRIATE): GREP '^\.%...\!' ÈACK3 Ü SED 'S/^.%...\!..//' Ü SED 'S/.%...\!//' >WC.ASM .%001! ;×ORD ÃOUNT UTILITY USING THE BURST COMMAND SET'S ÆASTLOAD FACILITY .%002! ;WRITTEN 92/06/25 BY ÃRAIG ÂRUCE FOR Ã= ÈACKING ÎET ÍAGAZINE .%003! ÔHE CODE IS WRITTEN FOR THE ÂUDDY ASSEMBLER AND HERE ARE A FEW SETUP DIRECTIVES. .%004! .MEM .%005! .BANK 15 .%006! .ORG $1C01 .%007! .%008! ;*** ÂÁÓÉà STARTUP CODE .%009! ÔHIS IS WHAT THE "10 SYS 7200" IN ÂÁÓÉà LOOKS LIKE. ÉT IS HERE SO THIS PROGRAM CAN BE EXECUTED WITH ÂÁÓÉà ÒÕÎ COMMAND. .%010! .WORD $1C1C .%011! .WORD 10 .%012! .BYTE $9E .%013! .ASC " 7200 : " .%014! .BYTE $8F .%015! .ASC " 6502 POWER!" .%016! .BYTE 0 .%017! .WORD 0 .%018! .WORD 0 .%019! .%020! JMP MAIN .%021! .%022! ;========== BURST READ LIBRARY ========== .%023! .%024! BURSTÓTATUS = $FE .%025! BURSTÂUFÃOUNT = $FF .%026! BURSTÂUF = $B00 "SERIALÆLAG" IS USED TO DETERMINE WHETHER A DEVICE IS ÆAST OR NOT, AND THE "IOÓTATUS" (A.K.A. "ÓÔ") IS TO TELL IF A DEVICE IS PRESENT OR NOT. .%027! SERIALÆLAG = $A1C .%028! IOÓTATUS = $90 "CIAÉCR" IS THE INTERRUPT CONTROL REGISTER OF ÃÉÁ#1. ÉT IS POLLED TO WAIT FOR DATA BECOMING AVAILABLE IN THE SHIFT REGISTER ("CIAÄATA"). "CIAÓERIALÃLK" IS THE ÓLOW SERIAL BUS CLOCK LINE THAT IS USED FOR HANDSHAKING ON THE ÆAST BUS. .%029! CIAÉCR = $DC0D .%030! CIAÓERIALÃLK = $DD00 .%031! CIAÄATA = $DC0C .%032! .%033! KERNELÌISTEN = $FFB1 .%034! KERNELÓECOND = $FF93 .%035! KERNELÃIOUT = $FFA8 .%036! KERNELÕNLSN = $FFAE .%037! KERNELÓPINP = $FF47 .%038! ÔHIS IS THE ERROR CODE VALUE THIS PACKAGE RETURNS IF IT DETECTS THAT A DEVICE IS NOT ÆAST. .%039! ERRÎOTÂURSTÄEVICE = 10 .%040! .%041! BURSTÆILENAMEÌEN = BURSTÂUFÃOUNT .%042! .%043! BURSTÏPEN = * ;(.Á=ÄEVICE, BURSTÂUF=ÆILENAME, .Ø=ÎAMEÌEN): ÓET UP FOR A BURST OPEN: CLEAR THE ÆAST FLAG AND THE DEVICE NOT PRESENT FLAG. .%044! STX BURSTÆILENAMEÌEN .%045! PHA .%046! LDA SERIALÆLAG .%047! AND #%10111111 .%048! STA SERIALÆLAG .%049! LDA #0 .%050! STA IOÓTATUS .%051! PLA ÃOMMAND THE DISK DEVICE TO ÌISTEN. ÔHEN CHECK IF THE DEVICE IS PRESENT OR NOT (BIT 7 OF IOÓTATUS). ÉF NOT PRESENT, RETURN THE KERNEL ERROR CODE. .%052! JSR KERNELÌISTEN .%053! BIT IOÓTATUS .%054! BPL + .%055! .%056! DEVÎOTÐRESENT = * .%057! JSR KERNELÕNLSN .%058! LDA #5 .%059! SEC .%060! RTS .%061! ÔELL DISK DEVICE TO LISTEN ON THE COMMAND CHANNEL (CHANNEL #15). .%062! + LDA #$6F .%063! JSR KERNELÓECOND ÓEND THE "Õ0"+ÃÈÒ$(159) BURST COMMAND HEADER. .%064! LDA #"U" .%065! JSR KERNELÃIOUT .%066! BIT IOÓTATUS .%067! BMI DEVÎOTÐRESENT .%068! LDA #"0" .%069! JSR KERNELÃIOUT .%070! LDA #$9F .%071! JSR KERNELÃIOUT ÓEND THE FILENAME. .%072! LDY #0 .%073! - LDA BURSTÂUF,Y .%074! JSR KERNELÃIOUT .%075! INY .%076! CPY BURSTÆILENAMEÌEN .%077! BCC - ÆINISH SENDING THE BURST COMMAND AND MAKE SURE THE DEVICE IS ÆAST. .%078! JSR KERNELÕNLSN .%079! LDA SERIALÆLAG .%080! AND #$40 .%081! BNE + .%082! SEC .%083! LDA #ERRÎOTÂURSTÄEVICE .%084! RTS .%085! ÄISABLE INTERRUPTS. .%086! + SEI ÐREPARE TO RECEIVE DATA AND SIGNAL THE DISK DRIVE TO START SENDING (BY TOGGLING THE SLOW SERIAL ÃLOCK LINE). .%087! CLC .%088! JSR KERNELÓPINP .%089! BIT CIAÉCR .%090! LDA CIAÓERIALÃLK .%091! EOR #$10 .%092! STA CIAÓERIALÃLK ÒEAD THE FIRST SECTOR OF THE FILE. .%093! JSR BURSTÒEAD ÃHECK FOR ERRORS. ÂURST ERROR CODE 2 (FILE NOT FOUND) IS TRANSLATED TO ITS KERNEL EQUIVALENT. .%094! LDA BURSTÓTATUS .%095! CMP #2 .%096! BCC + .%097! BNE SHORTÆILE .%098! SEC .%099! LDA #4 .%100! + RTS .%101! ÃHECK IF THIS IS A ONE-BLOCK FILE. .%102! SHORTÆILE = * .%103! CMP #$1F .%104! BNE OPENÅRROR .%105! LDY BURSTÂUFÃOUNT .%106! LDX #2 .%107! ÉF SO, WE HAVE TO READ THE TWO BYTES THAT THE DISK DRIVE FORGOT TO TELL US ABOUT. ÆOR EACH BYTE, WE WAIT FOR FOR THE ÓHIFT ÒEGISTER ÒEADY SIGNAL, TOGGLE THE CLOCK, AND READ THE SHIFT DATA REGISTER. É CAN GET AWAY WITH READING THE DATA REGISTER AFTER SENDING THE ACKNOWLEDGE SIGNAL TO THE DISK DRIVE BECAUSE É AM RUNNING WITH INTERRUPTS DISABLED AND IT COULD NOT POSSIBLY SEND THE NEXT BYTE BEFORE É PICK UP THE CURRENT ONE. ×E WOULDN'T WANT ANY ÎÍÉS HAPPENING WHILE DOING THIS, THOUGH. .%108! SHORTÆILEÂYTE = * .%109! LDA #$08 .%110! - BIT CIAÉCR .%111! BEQ - .%112! LDA CIAÓERIALÃLK .%113! EOR #$10 .%114! STA CIAÓERIALÃLK .%115! LDA CIAÄATA .%116! STA BURSTÂUF,Y .%117! INY .%118! DEX .%119! BNE SHORTÆILEÂYTE ÓTORE THE UPDATED BYTE COUNT AND EXIT. .%120! STY BURSTÂUFÃOUNT .%121! CLC .%122! RTS .%123! ÉN THE EVENT OF A BURST ERROR, RE-ENABLE THE INTERRUPTS SINCE THE USER MIGHT NOT CALL THE BURSTÃLOSE ROUTINE. ÒETURN THE TRANSLATED ERROR CODE. .%124! OPENÅRROR = * .%125! CLI .%126! SEC .%127! ORA #$10 .%128! RTS .%129! ÒEAD THE NEXT SECTOR OF THE FILE. .%130! BURSTÒEAD = * ;( ) : BURSTÂUF, BURSTÂUFÃOUNT, BURSTÓTATUS ×AIT FOR THE STATUS BYTE TO ARRIVE. .%131! LDA #8 .%132! - BIT CIAÉCR .%133! BEQ - ÔOGGLE CLOCK LINE FOR ACKNOWLEDGE. .%134! LDA CIAÓERIALÃLK .%135! EOR #$10 .%136! STA CIAÓERIALÃLK ÇET STATUS BYTE AND CHECK. ÉF 2 OR MORE AND NOT $1Æ, THEN AN ERROR HAS OCCURRED. ÉF 0, THEN PREPARE TO READ 254 DATA BYTES. .%137! LDA CIAÄATA .%138! STA BURSTÓTATUS .%139! LDX #254 .%140! CMP #2 .%141! BCC ACTUALÒEAD .%142! CMP #$1F .%143! BNE OPENÅRROR ÉF STATUS BYTE IS $1Æ, THEN GET THE NEXT BYTE, WHICH TELLS HOW MANY DATA BYTES ARE TO FOLLOW. .%144! LDA #8 .%145! - BIT CIAÉCR .%146! BEQ - .%147! LDX CIAÄATA .%148! LDA CIAÓERIALÃLK .%149! EOR #$10 .%150! STA CIAÓERIALÃLK .%151! .%152! ACTUALÒEAD = * .%153! STX BURSTÂUFÃOUNT .%154! LDY #0 .%155! ÒEAD THE DATA BYTES AND PUT THEM INTO THE BURST BUFFER. ÔHE CLOCK LINE TOGGLE VALUE IS COMPUTED BEFORE RECEIVING THE DATA FOR A LITTLE EXTRA ZIP. É HAVEN'T EXPERIMENTED WITH THIS, BUT YOU MIGHT BE ABLE TO TOGGLE THE CLOCK LINE BEFORE RECEIVING THE DATA (HOWEVER, PROBABLY NOT FOR THE FIRST BYTE). .%156! READÂYTE = * .%157! LDA CIAÓERIALÃLK .%158! EOR #$10 .%159! TAX .%160! LDA #8 .%161! - BIT CIAÉCR .%162! BEQ - .%163! STX CIAÓERIALÃLK .%164! LDA CIAÄATA .%165! STA BURSTÂUF,Y .%166! INY .%167! CPY BURSTÂUFÃOUNT .%168! BNE READÂYTE .%169! + CLC .%170! RTS .%171! ÃLOSE THE BURST PACKAGE: SIMPLY ÃÌÉ. .%172! BURSTÃLOSE = * .%173! CLI .%174! CLC .%175! RTS .%176! .%177! ;========== MAIN PROGRAM ========== .%178! ÔHIS IS THE WORD COUNTING APPLICATION CODE. .%179! BK×à = $0E .%180! BKÓELECT = $FF00 .%181! KERNELÃHRIN = $FFCF .%182! KERNELÃHROUT = $FFD2 .%183! ÔHE "WCÉN×ORD" IS A BOOLEAN VARIABLE THAT TELLS WHETHER THE FILE SCANNER IS CURRENTLY IN A WORD OR NOT. ÔHE ÌINES, ×ORDS, AND ÂYTES ARE 24-BIT COUNTERS. .%184! WCÉN×ORD = 2 ;(1) .%185! WCÌINES = 3 ;(3) .%186! WC×ORDS = 6 ;(3) .%187! WCÂYTES = 9 ;(3) .%188! .%189! MAIN = * ÐUT THE KERNEL ÒÏÍ AND É/Ï SPACE INTO CONTEXT THEN INITIALIZE THE COUNTING VARIABLES. .%190! LDA #BK×à .%191! STA BKÓELECT .%192! JSR WCÉNIT ÆOLLOW THE BURST READING PROCEDURE OUTLINE. .%193! JSR WCÇETÆILENAME .%194! JSR BURSTÏPEN .%195! BCC + .%196! JSR REPORTÅRROR .%197! RTS .%198! / JSR WCÓCANÂUFFER .%199! LDA BURSTÓTATUS .%200! CMP #$1F .%201! BEQ + .%202! JSR BURSTÒEAD .%203! BCC - .%204! JSR REPORTÅRROR .%205! + JSR BURSTÃLOSE ÒEPORT THE NUMBERS OF LINES, WORDS, AND CHARACTERS AND THEN EXIT. .%206! JSR WCÒEPORT .%207! RTS .%208! ÉNITIALIZE THE VARIABLES. .%209! WCÉNIT = * .%210! LDA #0 .%211! LDX #8 .%212! - STA WCÌINES,X .%213! DEX .%214! BPL - .%215! STA WCÉN×ORD .%216! RTS .%217! ÇET THE DEVICE AND FILENAME FROM THE USER. ÒETURNS PARAMETERS SUITABLE FOR PASSING TO BURSTÏPEN. .%218! WCÇETÆILENAME = * ;() : BURSTÂUF=ÆILENAME, .Á=ÄEVICE, .Ø=ÆILENAMEÌEN ÄISPLAY THE PROMPT. .%219! LDX #0 .%220! - LDA PROMPTÍSG,X .%221! BEQ + .%222! JSR KERNELÃHROUT .%223! INX .%224! BNE - ÇET THE INPUT LINE FROM THE USER. .%225! + LDX #0 .%226! - JSR KERNELÃHRIN .%227! STA BURSTÂUF,X .%228! CMP #13 .%229! BEQ + .%230! INX .%231! BNE - .%232! + JSR KERNELÃHROUT ÅXTRACT THE DEVICE NUMBER FROM THE START OF THE INPUT LINE. ÉF IT IS NOT THERE, ASSUME DEVICE NUMBER 8. .%233! LDA #8 .%234! CPX #2 .%235! BCC FILENAMEÅXIT .%236! LDY BURSTÂUF+1 .%237! CPY #":" .%238! BNE FILENAMEÅXIT .%239! SEC .%240! LDA BURSTÂUF .%241! SBC #"A"-8 .%242! TAY ÉF A DEVICE NAME WAS PRESENT, THEN WE HAVE TO MOVE THE REST OF THE FILENAME BACK OVER IT NOW THAT WE'VE EXTRACTED IT. .%243! LDX #0 .%244! - LDA BURSTÂUF+2,X .%245! STA BURSTÂUF,X .%246! CMP #13 .%247! BEQ + .%248! INX .%249! BNE - .%250! + TYA .%251! FILENAMEÅXIT = * .%252! RTS .%253! .%254! PROMPTÍSG = * .%255! .ASC "ENTER FILENAME IN FORM FILENAME, OR A:FILENAME, " .%256! .ASC "OR B:FILENAME, ..." .%257! .BYTE 13 .%258! .ASC "WHERE 'A' IS FOR DEVICE 8, 'B' IS FOR DEVICE 9, ..." .%259! .BYTE 13,0 .%260! ÓCAN THE BURST BUFFER AFTER READING A SECTOR INTO IT. .%261! WCÓCANÂUFFER = * .%262! LDY #0 .%263! CPY BURSTÂUFÃOUNT .%264! BNE + .%265! RTS .%266! + LDX WCÉN×ORD .%267! - LDA BURSTÂUF,Y .%268! ; JSR KERNELÃHROUT ;UNCOMMENT THIS LINE TO ECHO THE DATA READ .%269! CMP #13 .%270! BNE + ÉF THE CURRENT CHARACTER IS A CARRIAGE RETURN, THEN INCREMENT THE LINE COUNT. .%271! INC WCÌINES .%272! BNE + .%273! INC WCÌINES+1 .%274! BNE + .%275! INC WCÌINES+2 ÉF THE CHARACTER IS A ÔÁÂ, ÓÐÁÃÅ, OR A ÒÅÔÕÒÎ, THEN IT IS A ÄELIMITER; OTHERWISE, IT IS CONSIDERED A ÌETTER. .%276! + CMP #33 .%277! BCS ISÌETTER .%278! CMP #" " .%279! BEQ ISÄELIMITER .%280! CMP #13 .%281! BEQ ISÄELIMITER .%282! CMP #9 .%283! BEQ ISÄELIMITER .%284! .%285! ISÌETTER = * ÉF THE CHARACTER IS A ÌETTER AND THE PREVIOUS ONE WAS A ÄELIMITER, THEN INCREMENT THE WORD COUNT. .%286! CPX #1 .%287! BEQ SCANÃONT .%288! LDX #1 .%289! INC WC×ORDS .%290! BNE SCANÃONT .%291! INC WC×ORDS+1 .%292! BNE SCANÃONT .%293! INC WC×ORDS+2 .%294! JMP SCANÃONT .%295! .%296! ISÄELIMITER = * .%297! LDX #0 .%298! .%299! SCANÃONT = * .%300! INY .%301! CPY BURSTÂUFÃOUNT .%302! BCC - ÁDD THE NUMBER OF BYTES IN THE BURST BUFFER TO THE TOTAL BYTE COUNT FOR THE FILE. .%303! CLC .%304! LDA WCÂYTES .%305! ADC BURSTÂUFÃOUNT .%306! STA WCÂYTES .%307! BCC + .%308! INC WCÂYTES+1 .%309! BNE + .%310! INC WCÂYTES+2 .%311! + STX WCÉN×ORD .%312! RTS .%313! ÒEPORT THE NUMBER OF LINES, WORDS, AND BYTES READ. ÕSES A "PRINTF" TYPE OF SCHEME. .%314! WCÒEPORT = * .%315! LDX #0 .%316! - LDA REPORTÍSG,X .%317! BEQ REPORTÅXIT .%318! CMP #13 .%319! BCS + .%320! STX 14 .%321! TAX .%322! LDA 2,X .%323! STA 15 .%324! LDA 0,X .%325! LDY 1,X .%326! LDX 15 .%327! JSR PUTNUM .%328! LDX 14 .%329! JMP REPORTÃONT .%330! + JSR KERNELÃHROUT .%331! REPORTÃONT = * .%332! INX .%333! BNE - .%334! REPORTÅXIT = * .%335! RTS .%336! .%337! REPORTÍSG = * .%338! .BYTE 13 .%339! .ASC "LINES=" .%340! .BYTE WCÌINES .%341! .ASC ", WORDS=" .%342! .BYTE WC×ORDS .%343! .ASC ", CHARS=" .%344! .BYTE WCÂYTES,27 .%345! .ASC "Q" .%346! .BYTE 13,0 .%347! ÒEPORTS THE ERROR NUMBER GIVEN IN THE .Á REGISTER. ÃALLED AFTER AN ERROR IS RETURNED FROM A BURST ROUTINE. .%348! REPORTÅRROR = * ;( .Á=ERRÎUM ) .%349! PHA .%350! LDX #0 .%351! - LDA ERRORÍSG,X .%352! BEQ + .%353! JSR KERNELÃHROUT .%354! INX .%355! BNE - .%356! + PLA .%357! LDY #0 .%358! LDX #0 .%359! JSR PUTNUM .%360! LDA #13 .%361! JSR KERNELÃHROUT .%362! RTS .%363! .%364! ERRORÍSG = * .%365! .ASC "*** I/O ERROR #" .%366! .BYTE 0 .%367! .%368! ;==========LIBRARY========== .%369! ÒOUTINE TO PRINT OUT THE 24-BIT NUMBER GIVEN IN .ÁÙØ. .%370! LIBWORK = $60 .%371! ITOAÂIN = LIBWORK .%372! ITOAÂCD = LIBWORK+3 .%373! ITOAÆLAG = LIBWORK+7 .%374! .%375! PUTNUM = * ÉNITIALIZE BINARY AND ÂÃÄ (ÂINARY ÃODED ÄECIMAL) REPRESENTATIONS OF NUMBER. .%376! STA ITOAÂIN+0 .%377! STY ITOAÂIN+1 .%378! STX ITOAÂIN+2 .%379! LDX #3 .%380! LDA #0 .%381! - STA ITOAÂCD,X .%382! DEX .%383! BPL - .%384! STA ITOAÆLAG .%385! LDY #24 .%386! SED .%387! ÒOTATE EACH BIT OUT OF THE BINARY NUMBER AND THEN MULTIPLY THE ÂÃÄ NUMBER BY TWO AND ADD THE BIT IN. ÅFFECTIVELY, WE ARE SHIFTING THE BITS OUT OF THE BINARY NUMBER AND INTO THE ÂÃÄ REPRESENTATION OF THE NUMBER. .%388! ITOAÎEXTÂIT = * .%389! ASL ITOAÂIN+0 .%390! ROL ITOAÂIN+1 .%391! ROL ITOAÂIN+2 .%392! LDX #3 .%393! - LDA ITOAÂCD,X .%394! ADC ITOAÂCD,X .%395! STA ITOAÂCD,X .%396! DEX .%397! BPL - .%398! DEY .%399! BNE ITOAÎEXTÂIT .%400! CLD ÔAKE THE ÂÃÄ BYTES AND SPIT OUT THE TWO DIGITS THEY CONTAIN. .%401! LDX #0 .%402! LDY #0 .%403! - LDA ITOAÂCD,X .%404! JSR ITOAÐUTÈEX .%405! INX .%406! CPX #4 .%407! BCC - .%408! RTS .%409! .%410! ITOAÐUTÈEX = * .%411! PHA .%412! LSR .%413! LSR .%414! LSR .%415! LSR .%416! JSR ITOAÐUTÄIGIT .%417! PLA .%418! AND #$0F .%419! ÐRINT OUT THE INDIVIDUAL DIGITS OF THE NUMBER. ÉF THE CURRENT DIGIT IS ZERO AND ALL DIGITS SO FAR HAVE BEEN ZERO, THEN DON'T OUTPUT ANYTHING, UNLESS IT IS THE LAST DIGIT OF THE NUMBER. .%420! ITOAÐUTÄIGIT = * .%421! CMP ITOAÆLAG .%422! BNE + .%423! CPY #7 .%424! BCC ITOAÐUTÄIGITÅXIT .%425! + ORA #$30 .%426! STA ITOAÆLAG .%427! JSR KERNELÃHROUT .%428! ITOAÐUTÄIGITÅXIT = * .%429! INY .%430! RTS 5. ÕÕÅÎÃÏÄÅÄ ÐÒÏÇÒÁÍ ÈERE IS THE BINARY EXECUTABLE IN UUENCODED FORM. ÔHE ÃÒÃ32 OF IT IS 3676144922. ÌÏÁÄ AND ÒÕÎ IT LIKE A REGULAR ÂÁÓÉà PROGRAM. BEGIN 640 WC ÍÀ1Ð<'ÀÈÀÇÂÀ×,ÃÀÐ(#È@ÃÒÀÖ-3ÀÒ(%!/5Ô52(0ÀÀÀÀÀÀ3!$=ÁÏ](Ë1Ð**;^- Í'ÀÊÉÀ(60:""Ñ_Ò20$À<@ËÏ^É!3Á@Ê6\@Ä_^É52"È_Ò20,.ÎÉ,""È_ÚÆ?(*Ã_ ÍÈÀ"ÙÀÀÌ@Ê/_(Ñ/^0]2"Î_ÚÔ<"ÂÅÀÔÀ0ØÊ0É@>!@@1_\Ì#=ÒÍÀ-Õ)$(ÔÀ×2"] Í'*7^Ò0*0!=À$.*Ä$8,Ä?Ô"&Ä_Ú("Ê0@Ì#=ÓÐ^ÚÔÀ×4Ä0Ã0#=Ë0Ó<Æ0À+Ò,Ë0 ÍÙØ3_&&!8.ÀÄ08*Ä(+À×<\/ÎÍÀ-Õ)$(ÔÀ×:Ô,×(7^ÈÏ[)ÀÉÀ6Ò1_0×:Ä(+À×< Í\/ÎÎ#-ÒÍÀ-Õ)$(ÔÀ×8;_ÈÀ"ÍÀ-Õ)$*ÊÉ""Ð-×/#[Ã@#=Ë0Ó<Æ0À+Ò,3_Ô.48 Í8%@88*Ä.Ã0#_(#Ô=($Ä=(",<ÄÀ0@È!Ù@(À4>É?[)'_À((+Ô<Ä/(@È!Ø@#ÁÔ@ Í6ÑÙ@Ê0"Â")4#ÒÁ#[Á0)@È@"]Ã1×Ð!Â#2_^Ã0]:(À(,__Ç0À+Ò0×ÐÀ^Ã0\Ò#2 ÍÌÚÄ(ØÀ*0'ÊÐ!"\ÀÚÔ!<ØË0À+Ú3ÆÈÈ@"]À@Î=ÀÀÏ)#?À#Ú-#ÓÆ&!%3Å1%4Â!& Í24Ñ%3Ä%-12!)3Â!&3Õ)-($9)3$5.04Õ%+"!/4Â!!.Ä9)3$5.04Õ%+"!/4Â!" Í.Ä9)3$5.04Õ%+"ÀÎ+ÂØ-5ÔÁ%4Ä4@)Ô$Ç($Å3($9/4Â!$159)0Ô4@."Ð@)Ô(Ç Í($Å3($9/4Â!$159)0Ô4@.2Ð@+ÂØÎ#0"@À,3_ÔÀ%@É@*ÙÀÀÏ)#=À*Ù@/0!Î8$ ÍÔÀ+Æ!<ÄÁÌÀÓ)(/À;Ò0×Ð%\Ä)\!/@À?À1È@'Æ!ÍÀ+Ù@?0!^8(3$0>È@#(Ñ/^0 ÍÑ1ÂÅ"67_Á0Æ0!Î8*ÔÀ+Æ"Ø8"8*(ÀÏ8(>\!_)#;À5Á@ÚÊÍ0*%#[4ÀÍÀ&Æ#Ò#, Í'Ê8.3'Ø>(-+_Ú-#<8ÀÕ,24Ù%4ÓÔ#+"!73Õ)$4ÓÔ&+"!#2$%24ÓÔ)&Õ$-À$ ÍÀ+Ö\'ÏÀ&(-+_Ú-#Õ:*ÀÀÈ@À@Ó!ÚÉ#2#2_ÖÀÊ*ÂÈ@22]/($524Ä]2(",ÀÁ6"$ Í889ÂÈ@.ÉÀ)5ÃÒÁ#[Á6>@&/@&8"9Á)Æ*ÂÀ[5Ã=6.58\È0]ØÃ0[-ÂÂÀ*ÀÀÍ6,@ Ä!!_ÈØÀ20]Æ!(2ÄÉ*2ÂÀ/'Ö@É#\5ÇÔÀ3À!ÙÀ'"3"%9Ò#2_\Á@ÀÀÀÀ À END 6. ÒÅÆÅÒÅÎÃÅÓ [1] ÃOMMODORE ÂUSINESS ÍACHINES, _ÃOMMODORE_1571_ÄISK_ÄRIVE_ÕSER'S_ÇUIDE_, ÃÂÍ, 1985. [2] ÒAINER ÅLLINGER, _1571_ÉNTERNALS_, ÁBACUS ÓOFTWARE, ÊUNE 1986. =============================================================================== ÎEXT ÉSSUE: (HOPEFULLY!) ÌEARNING ÍÌ - ÐART 4 ÉN THE NEXT ISSUE WE'LL EMBARK ON A PROJECT OF MAKING A SPACE INVADERS STYLE GAME FOR THE Ã=64/128 USING THE ËÅÒÎÁÌ ROUTINES WE'VE LEARNED. ÔHE ÄEMO ÃORNER: ÆÌÉ - MORE COLOR TO THE SCREEN ÁLL OF US HAVE HEARD COMPLAINTS ABOUT THE COLOR CONSTRAINTS ON Ã64. ÆÌÉ PICTURE CAN HAVE ALL OF THE 16 COLORS IN ONE CHAR POSITION. ×HAT THEN IS THIS ÆÌÉ AND HOW IT IS DONE ? ÔHE 1351 ÍOUSE ÄEMYSTIFIED ÁN INDEPTH LOOK AT HOW THE 1351 MOUSE OPERATES AND HOW TO ACCESS IT WITHIN YOUR OWN ÍÌ PROGRAMS. ÆOR ÂASIC PROGRAMMERS, A DRIVER FOR THE 80 COLUMN SCREEN IS ALSO SUPPLIED. ÌÉÔÔÌÅ ÒÅÄ ÒÅÁÄÅÒ: ÍÓ-ÄÏÓ FILE READER FOR THE 128 AND 1571/81 DRIVES. ÔHIS ARTICLE WILL PRESENT A PACKAGE THAT READS ÍÓ-ÄÏÓ FILES AND THE ROOT DIRECTORY OF ÍÓ-ÄÏÓ DISKS. ÔHIS PACKAGE WILL USE THE DYNAMIC MEMORY ALLOCATION PACKAGE INTRODUCED IN ÈACKING ÉSSUE #2 TO ALLOW LARGE FILES TO BE READ IN. ÔHE APPLICATION-LEVEL CODE HASN'T BEEN FINALIZED YET, BUT IT WILL PROBABLY USE A MENU-ORIENTED FULL-SCREEN DISPLAY AND WILL READ AND TRANSLATE ÍÓ-ÄÏÓ AND ÃOMMODORE FILES. ============================================================================= ÅÎÄ OF ÃOMMODORE ÈACKING ÉSSUE 3. =============================================================================